(function (w) {
  w.swiper = function (options) {


    if (options.el === undefined) {
      this.console.error('el必须指定')
    }
    var swiper = options.el;
    var page = options.page || null;
    var isAutoPlay = options.isAutoPlay || false;
    var delay = options.delay || 5000
    // var gpu = options.gpu || true;
    var gpu = true;
    if (options.gpu !== undefined && !options.gpu) {
      gpu = false;
    }

    swiper.classList.add('swiper');
    let swiperWrapper = swiper.querySelector('.swiper-wrapper')
    let Current = swiper.querySelectorAll('.swiper-item').length
    // 开启3D加速
    if (gpu) {
      transformCss(swiperWrapper, 'translateZ', 0)
    }

    let index = 0;
    // 如果指定了小圆点包裹元素
    if (page) {
      // 添加类
      page.classList.add('page')
      for (let i = 0; i < Current; i++) {
        var span = this.document.createElement('span')
        page.appendChild(span)
      }
      // 获取所有小圆点的集合
      var pageItem = page.querySelectorAll('span')
    }
    // 将所有的swiper 复制一份
    swiperWrapper.innerHTML += swiperWrapper.innerHTML
    let swiperItem = swiper.querySelectorAll('.swiper-item')
    swiperWrapper.style.width = swiperItem.length * 100 + '%'
    swiperItem.forEach(function (item) {
      item.style.width = 100 / swiperItem.length + '%'
    });
    // swiper.style.height = swiperWrapper.offsetHeight + 'px'



    // swiper.addEventListener('touchstart', function (event) {
    //   // 阻止全局默认动作

    // })


    if (isAutoPlay) {
      // 自动播放
      var timer = setInterval(autoPlay, delay)
    }

    // 初始化
    setSwiperCurrent(index)
    // 给swiperWrapper监听过渡结束
    swiperWrapper.addEventListener('transitionend', function () {
      if (index >= swiperItem.length - 1) {
        index = Current - 1;
        swiperWrapper.style.transition = 'none'
        transformCss(swiperWrapper, 'translateX', -index * swiper.clientWidth)
      }
    })

    swiper.addEventListener('touchstart', function (event) {
      // 取消过渡
      swiperWrapper.style.transition = 'none';

      // 判断无缝滑动的临界值
      if (index <= 0) {
        index = Current;
        transformCss(swiperWrapper, 'translateX', -index * swiper.clientWidth)
      } else if (index >= swiperItem.length - 1) {
        index = Current - 1;
        transformCss(swiperWrapper, 'translateX', -index * swiper.clientWidth)
      }

      // 获取触点对象
      let touch = event.changedTouches[0];
      // 获取垂直方向的触点位置
      this.startY = touch.clientY;
      // 获取触点起始位置
      this.startX = touch.clientX;
      // 获取swiperWrapper元素的初始位置
      this.eleLeft = transformCss(swiperWrapper, 'translateX')
      // 获取时间戳 记录触摸开始的时间
      this.startTime = (new Date).getTime();
      this.isFirstMove = true
      this.isHorizontal = true
      if (isAutoPlay) {
        // 暂停定时
        clearInterval(timer)
      }
      // event.preventDefault()
    })

    swiper.addEventListener('touchmove', function (event) {
      // 如果不是水平滑动
      if (!this.isHorizontal) {
        return;
      }
      let touch = event.changedTouches[0];
      // 触点水平方向滑动结束的位置
      let endX = touch.clientX;
      // 触点垂直方向滑动结束的位置
      var endY = touch.clientY;
      // 计算触点的间距
      this.disX = endX - this.startX;
      var disY = endY - this.startY

      if (this.isFirstMove) {
        this.isFirstMove = false
        // 判断是水平滑动 还是 垂直滑动
        if (Math.abs(this.disX) > Math.abs(disY)) {
          // 水平距离>垂直距离
        } else {
          this.isHorizontal = false;
          this.disX = 0
          return;
        }
      }
      // 初始位置加上手指头滑动的距离
      transformCss(swiperWrapper, 'translateX', this.eleLeft + this.disX)
      // 阻止垂直滚轮滑动
      // 阻止浏览器默认动作
      event.preventDefault()
      // // 设置swiper-wrapper
      // swiperWrapper.style.left = this.eleLeft + this.disX + 'px';
    })

    swiper.addEventListener('touchend', function (event) {
      // if (Math.abs(this.disX) > swiper.clientWidth / 2) {
      //   // 向左滑动 下一张  间距负值
      //   // 向右滑动 上一张  间距正值
      //   if (this.disX < 0) {
      //     index++
      //   } else if (this.disX > 0) {
      //     index--
      //   }
      // }

      // 设置过渡
      swiperWrapper.style.transition = '0.5s';

      // 获取结束时间
      var endTime = (new Date).getTime();
      // 计算滑动的时间差
      resultTime = endTime - this.startTime;
      // 根据时间差进行判断
      if (resultTime < 300) {
        // 快速滑动
        if (this.disX < 0) {
          index++
        } else if (this.disX > 0) {
          index--
        }
      } else {  //普通滑动  没有加速
        // 设置索引
        index = -Math.round(transformCss(swiperWrapper, 'translateX') / swiper.clientWidth)
      }
      // 调用函数设置位置及小圆点
      setSwiperCurrent(index)
      if (isAutoPlay) {
        // 重启定时器
        timer = setInterval(autoPlay, delay)
      }
    })

    function setSwiperCurrent(m) {
      // 判断索引值
      if (m < 0) {
        m = 0;
      } else if (m > swiperItem.length - 1) {
        m = swiperItem.length - 1;
      }
      // swiperWrapper.style.left = -m * swiper.clientWidth + 'px';
      transformCss(swiperWrapper, 'translateX', -m * swiper.clientWidth)
      if (page) {
        // 去除所有小圆点的高亮
        pageItem.forEach(function (item) {
          item.classList.remove('active')
        })
        // 给当前的小圆点高亮，添加active
        pageItem[m % Current].classList.add('active')
      }


      index = m;       //给全局索引重置赋值
    }

    function autoPlay() {
      swiperWrapper.style.transition = '.5s';
      // 索引+1
      index++;
      // 执行变换
      setSwiperCurrent(index)
      // 加定时  是因为过度需要时间  不加定时的话  没等过渡完就已经判断完了  还可以放在过渡之后
      // setTimeout(function () {
      //   if (index >= swiperItem.length - 1) {
      //     index = Current - 1;
      //     swiperWrapper.style.transition = 'none'
      //     transformCss(swiperWrapper, 'translateX', -index * swiper.clientWidth)
      //   }
      // }, 500)
    }
  }
})(window);